[アップデート] Amazon Cognito で過去のパスワードの再利用を防止するためのオプションが利用出来るようになりました

[アップデート] Amazon Cognito で過去のパスワードの再利用を防止するためのオプションが利用出来るようになりました

Clock Icon2024.08.10

いわさです。

先日のアップデートで Amazon Cognito の高度なセキュリティ機能が色々と強化されています。
先日はユーザーアクテビティログを Cognito 外部へ転送出来る新機能を紹介しました。

https://dev.classmethod.jp/articles/cognito-user-activity-export/

同じタイミングで「パスワードの再利用を防ぐ」という機能も追加されています。

https://aws.amazon.com/about-aws/whats-new/2024/08/amazon-cognito-asf-password-reuse-stream-security-events/

Congito ユーザープールのユーザーは、パスワード変更が可能です。
パスワードポリシーで文字数や種類を設定することが出来るのですが、過去に使ったことのあるパスワードを許可しないなどの設定は出来ませんでしたが、これが出来るようになりました。

パスワード再利用防止の設定方法

まず前提として高度なセキュリティ機能が有効化されていることが前提となります。
ユーザープールの高度なセキュリティタブで有効化されているか確認してください。
「パスワードの再利用を防ぐ」から本機能が既に使われているかどうかも確認することが出来ます。高度なセキュリティ有効化直後はこの機能は無効化されています。

ACB961E2-0714-43A0-A6EB-81059B60D6B4_1_105_c-2.jpeg

その後の設定方法ですが、高度なセキュリティタブでは特に設定変更を行う必要はありません。
サインインエクスペリエンスタブのパスワードポリシーから設定が可能です。

3C286C11-6730-425B-B12C-38FB9EB3FAFC_1_105_c.jpeg

従来はパスワードの再利用防止設定が出来ませんでしたが、アップデート後に高度なセキュリティ機能を有効化した場合に入力が出来るようになっています。

0C03D7A6-4F82-4A3F-90D8-E4D40B6A714D.png

こんな感じで設定出来る。0 から 24 までの数値を入力することが出来まして、パスワード履歴の何個前までのパスワードを拒否するかを数値として入力する感じです。

ここで 1 以上が設定されていると、先程の高度なセキュリティタブの表示も次のようになります。

913EA189-EA89-4D6D-B61C-9E79AD884F4F_1_105_c.jpeg

ちなみに高度なセキュリティ機能が有効化されていない場合は、次のようにパスワード再利用防止機能が非活性となり、この機能を使うためには高度なセキュリティ機能を有効化する必要があることがわかります。

CC3C032B-3FCE-44C1-9D17-ABDF24B015C4.png

パスワード再利用防止の挙動を確認してみる

「2」を設定した場合は現時点と一つ前までのパスワードが再利用できない

ここではパスワード再利用防止として「2」を設定した状態の挙動を確認してみました。
ユーザープールに作成済みのユーザーに対して認証を行ってアクセストークンを取得し、AWS CLI でchange-passwordコマンドを実行します。

https://docs.aws.amazon.com/ja_jp/cli/latest/reference/cognito-idp/change-password.html

# 222222 → 333333
% cat changepassword.json
{
    "PreviousPassword": "222222",
    "ProposedPassword": "333333",
    "AccessToken": "..."
}
% aws cognito-idp change-password --cli-input-json file://changepassword.json

# 333333 → 222222
% cat changepassword.json
{
    "PreviousPassword": "333333",
    "ProposedPassword": "222222",
    "AccessToken": "..."
}
% aws cognito-idp change-password --cli-input-json file://changepassword.json

An error occurred (PasswordHistoryPolicyViolationException) when calling the ChangePassword operation: Password has previously been used

おー、エラーになりました。PasswordHistoryPolicyViolationExceptionです。
1つ前のパスワードはダメだということですね。

2つ前のパスワードだとどうでしょうか。

# 333333 → 444444
% cat changepassword.json
{
    "PreviousPassword": "333333",
    "ProposedPassword": "444444",
    "AccessToken": "..."
}
% aws cognito-idp change-password --cli-input-json file://changepassword.json

# 444444 → 222222
% cat changepassword.json
{
    "PreviousPassword": "444444",
    "ProposedPassword": "222222",
    "AccessToken": "..."
}
% aws cognito-idp change-password --cli-input-json file://changepassword.json

おっ、これはエラーになりませんでした。
「2」を設定した時は1つ前に使っていたパスワードはダメで、2つ前に使っていたパスワードは再利用が出来ました。

「1」を設定した場合は現時点のパスワードが再利用できない

じゃあ「1」を設定した場合はどうなるのでしょうか。

A2258240-F023-48BA-B1ED-206A49725AC8_4_5005_c.jpeg

# 222222 → 333333
% cat changepassword.json
{
    "PreviousPassword": "222222",
    "ProposedPassword": "333333",
    "AccessToken": "..."
}
% aws cognito-idp change-password --cli-input-json file://changepassword.json

# 333333 → 222222
% cat changepassword.json
{
    "PreviousPassword": "333333",
    "ProposedPassword": "222222",
    "AccessToken": "..."
}
% aws cognito-idp change-password --cli-input-json file://changepassword.json

先ほどと異なり今度はエラーにならずに一つ前に使っていたパスワードを再利用することが出来ました。

ちなみに、現在使用中のパスワードへの変更は出来ませんでした。
意味があるのかわからないですが。

% cat changepassword.json
{
    "PreviousPassword": "222222",
    "ProposedPassword": "222222",
    "AccessToken": "..."
}
% aws cognito-idp change-password --cli-input-json file://changepassword.json

An error occurred (PasswordHistoryPolicyViolationException) when calling the ChangePassword operation: Password has previously been used

「1」という設定値は現在設定中のパスワードの再利用を許可しないということですね。

無効あるいは 0 だと再利用チェックされない

まず 0 に設定すると次のように高度なセキュリティ機能タブ上で「パスワードの再利用を防ぐ」が「未設定」となりました。
つまり、設定値「0」は機能の無効化を指しているようです。

3F13D7B2-3AC9-4986-B182-0262A28B854E_1_105_c.jpeg

余談ですが、パスワード再利用防止機能を使っている時に高度なセキュリティ機能を無効化しようとすると次のようなダイアログが表示されて無効化が出来ません。
事前に「0」を設定する必要があるとのことなので、やはり機能の無効化を指しているようです。

13057C6B-881C-48F9-BD30-4590D4C73215_1_105_c.jpeg

無効化した時の挙動ですが、先ほどは NG だった現在使用中のパスワードへの変更が出来ました。なるほど。

% cat changepassword.json
{
    "PreviousPassword": "222222",
    "ProposedPassword": "222222",
    "AccessToken": "..."
}
% aws cognito-idp change-password --cli-input-json file://changepassword.json

ちなみに上記挙動は高度なセキュリティがオフの場合でも同様でした。

(余談)パスワード変更しすぎるとロックされる

今回の検証の過程で知ったのですが、パスワード変更 API はユーザーごとに 1 時間あたり 5 回までという制限があるようです。

https://dev.classmethod.jp/articles/tsnote-cognito-change-password-error/

短期間にパスワードを変更しすぎてロックされてしまいました。注意することでも無いとは思いますが仕様として知っておきましょう。

% aws cognito-idp change-password --cli-input-json file://changepassword.json

An error occurred (LimitExceededException) when calling the ChangePassword operation (reached max retries: 2): Attempt limit exceeded, please try after some time.

さいごに

本日は Amazon Cognito で過去のパスワードの再利用を防止するためのオプションが利用出来るようになったので使ってみました。

前回の続いてこの機能もパスワードポリシーの中でたまに要望として聞くことがありますね。
有償の高度なセキュリティ機能の利用が前提にはなってしまいますが、利用できずに見送っていた方は是非再検討してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.